iOS SDK使用指南

本文将会为您介绍如何使用iOS SDK接入您的项目,建议在接入开始前,先阅读数据规则一章,在了解TA数据规则后再进行接入。如果您想要了解游戏行业应该收集哪些数据以及如何收集,请查阅接入样例。 如果您想获得API接口的详细说明,可以查看iOS SDK API文档。您可以在访问GitHub获取iOS SDK的源代码。

最新版本为:2.2.2

更新时间为:2019-12-03

下载地址

1. 集成与初始化SDK

1.1 自动集成SDK

使用CocoaPods 安装 SDK

1.创建并编辑Podfile内容(如果已有,直接编辑):

创建Podfile,项目工程(.xcodeproj)文件同目录下命令行执行命令:

pod init

编辑Podfile的内容如下:

platform :ios, '9.0'
target 'YourProjectTarget' do
  pod 'ThinkingSDK'  #ThinkingSDK
end

2.执行安装命令

pod install

成功以后,会出现如下记录:

3.导入成功,启动工程

命令执行成功后,会生成 .xcworkspace 文件,说明您已成功导入iOS SDK。打开 .xcworkspace 文件以启动工程(注意:此时不能同时开启.xcodeproj文件)

1.2 手动集成SDK

1.下载并解压iOS SDK

2.将ThinkingSDK.framework以及TDAnalyticsSDK.bundle拖入XCode Project Workspace 工程项目中

3.修改工程设置Targets选项下的Build Settings选项卡中Other linker flags的设置 添加 -ObjC

4.切换到Build Phases选项卡,在Link Binary With Libraries栏目下添加如下依赖项:

libz.dylibSecurity.frameworkSystemConfiguration.frameworklibsqlite3.tbd

1.3 初始化SDK

在1.2.0版本中,新增多APP ID实例的特性,关于多APPID的使用指南,请参考iOS SDK 多APPID指南一节

在 AppDelegate.m 中添加#import <ThinkingSDK/ThinkingAnalyticsSDK.h>

然后在 application:didFinishLaunchingWithOptions:中添加初始化

如下

//初始化
ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK startWithAppId:APP_ID withUrl:SERVER_URL];

//支持初始化多个APPID实例
//ThinkingAnalyticsSDK *instance2 = [ThinkingAnalyticsSDK startWithAppId:APP_ID2 withUrl:SERVER_URL2];
// 初始化
let instance = ThinkingAnalyticsSDK.start(withAppId: "YOUR_APPID", withUrl: "YOUR_SERVER_URL")

//支持初始化多个APPID实例
//let instance2 = ThinkingAnalyticsSDK.start(withAppId: "YOUR_APPID2", withUrl: "YOUR_SERVER_URL2")

参数APP_ID是您的项目的APP_ID,在您申请项目时会给出,请在此处填入

参数SERVER_URL为数据上传的URL

如果您使用的是云服务,请输入以下URL:

https://receiver.ta.thinkingdata.cn

http://receiver.ta.thinkingdata.cn

如果您使用的是私有化部署的版本,请输入以下URL:

http://数据采集地址

如需使用https协议,请自行申请具有SSL证书的域名,TA工作人员将会协助进行端口配置。

在完成初始化后,您可以使用以下方式使用SDK:

// 后续可以通过如下两种方法使用 SDK
[instance track:@"event_name" properties:eventProperties];
// [[ThinkingAnalyticsSDK sharedInstanceWithAppid:APP_ID] track:@"event_name" properties:eventProperties];

// 1.2.0之前,或者单实例可使用下列使用 SDK
// [[ThinkingAnalyticsSDK sharedInstance] track:@"event_name" properties:eventProperties];
// 后续可以通过如下两种方法使用 SDK
let properties:Dictionary<String,String>=["key":"value"];
instance.track("event_name", properties:properties)

// 1.2.0之前,或者单实例可使用下列使用 SDK
// ThinkingAnalyticsSDK.sharedInstance(withAppid: "YOUR_APPID").track("event_name", properties:eventProperties)

1.4 开启与 H5 页面的打通(可选)

如果需要与采集 H5 页面数据的JavaScript SDK进行打通,请调用如下接口,详情请参考H5 与 APP SDK 打通一节

//打通H5页面数据
[instance addWebViewUserAgent];
// [[ThinkingAnalyticsSDK sharedInstanceWithAppid:APP_ID] addWebViewUserAgent];
//打通H5页面数据
instance.addWebViewUserAgent()

2. 设置用户ID

在使用TGA的SDK之后,SDK会使用UUID作为每个用户的默认访客ID,该ID将会作为用户在未登录状态下身份识别ID。需要注意的是,UUID在用户重新安装APP以及更换设备时将会变更。

a) 设置访客ID(可选)

如果用户在您的产品中可以未登录状态下使用,且您需要配置用户在未登录状态下的访客ID,则您可以调用identify:来进行设置:

[instance identify:@"123ABCabc"];
instance.identify("123ABCabc")

如果您需要替换访客ID,则应当在初始化SDK结束之后立即进行调用,请勿多次调用,以免产生无用的账号

如果需要获得访客ID,可以调用getDistinctId获取:

//返回访客ID,多实例的情况下,返回的是调用实例的访客ID
[instance getDistinctId];
//返回访客ID,多实例的情况下,返回的是调用实例的访客ID
instance.getDistinctId()

b) 设置账号ID

在用户进行登录时,可调用login:来设置用户的账号ID,TA平台优先以账号ID作为身份标识,设置后的账号ID将会被保存,多次调用login:将覆盖先前的账号ID:

[instance login:@"[email protected]"];
instance.login("[email protected]")

请注意,该方法不会上传用户登录的事件

c) 清空账号ID

在用户产生登出行为之后,可调用logout来清除账号ID,在下次调用login:之前,将会以访客ID进行身份识别

[instance logout];
instance.logout()

我们推荐您在显性的登出事件时调用logout,比如用户产生注销行为时才调用,不需要在关闭App时进行调用。

请注意,该方法不会上传用户登出的事件

3. 发送事件

在SDK初始化完成之后,您就可以调用track:properties:来上传事件,一般情况下,您可能需要上传20~100个不同的事件,如果您是第一次使用TA后台,我们推荐您先上传几个事件测试数据通道是否打通。

如果您对需要发送什么样的事件有疑惑,可以查看快速使用指南以及接入样例了解更多信息。

a) 发送事件

您可以调用track:properties:来上传事件,建议您根据先前梳理的文档来设置事件的属性以及发送信息的条件:

//该事件没有设置属性,properties:的参数请传nil
[instance track:@"StartApp" properties:nil];

//上传购买商品事件
NSMutableDictionary *eventProperties = [NSMutableDictionary dictionary];
[eventProperties setValue:@"商品名" forKey:@"product_name"];
[eventProperties setValue:[NSNumber numberWithInt:1] forKey:@"product_num"];
[eventProperties setValue:@(YES) forKey:@"IsFirstBuy"];
[instance track:@"product_buy" properties:eventProperties];
//该事件没有设置属性
instance.track("StartApp")
//上传购买商品事件

instance.track("product_buy", properties: ["product_name": "商品名",
                         "product_num": NSNumber.init(value: 1),
                         "IsFirstBuy": true])

  • 事件的名称是NSString类型,只能以字母开头,可包含数字,字母和下划线“_”,长度最大为50个字符,对字母大小写不敏感。
  • 事件的属性是一个NSDictionary对象,其中每个元素代表一个属性。
  • Key的值为属性的名称,为NSString类型,规定只能以字母开头,包含数字,字母和下划线“_”,长度最大为50个字符,对字母大小写不敏感。
  • Value为该属性的值,可以为NSStringNSNumber以及NSDate,如果您需要上传布尔型的属性,则请以@YES@NO赋值。

在2.2.0版本中加入了设置事件触发时间及时间偏移的方法重载,支持传入NSDate类型的参数来设置事件触发时间,以NSTimeZone类型的参数来设置时间偏移。不传入该参数,则取track:被调用时的本机时间以及偏移作为事件触发时间以及时区偏移:

[instance track:@"product_buy"
properties:@{@"product_name":@"商品名",
          @"product_num":[NSNumber numberWithInt:1],
          @"IsFirstBuy":@YES}
          time:[NSDate date]
          timeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];
instance.track("product_buy",
               properties: ["product_name": "商品名",
                            "product_num": NSNumber.init(value: 1),
                            "IsFirstBuy": true],
               time: Date(),
               timeZone: NSTimeZone(name: "Asia/Shanghai")! as TimeZone)

另外,尽管事件可以设置触发时间,但是接收端会做如下的限制,只接收相对服务器时间在前10天至后3天的数据,超过时限的数据将会被视为异常数据,整条数据无法入库。

b) 设置公共事件属性

对于一些重要的属性,譬如玩家的等级、区服和渠道等,这些属性需要设置在每个事件中,此时您可以将这些属性设置为公共事件属性。公共事件属性指的就是每个事件都会带有的属性,您可以调用setSuperProperties:来设置公共属性 ,我们推荐您在发送事件前,先设置公共事件属性。

  • 公共事件属性同样也是一个NSDictionary对象,其中每个元素代表一个属性。
  • Key的值为属性的名称,为NSString类型,规定只能以字母开头,包含数字,字母和下划线“_”,长度最大为50个字符,对字母大小写不敏感。
  • Value为该属性的值,可以为NSStringNSNumber以及NSDate,如果需要上传布尔型的属性,请以@YES@NO赋值。

[instance setSuperProperties:@{@"Channel":@"ABC",
                              @"isTest":@YES}];
// 设置后上传数据:

[instance track:@"product_view"
     properties:@{@"product_id":@"A1234"}];

// 相当于在事件中设置了属性:

[instance track:@"product_view"
     properties:@{@"Channel":@"ABC",
                    @"isTest":@YES,
                    @"product_id":@"A1234"}];
instance.setSuperProperties(["Channel" : "ABC",
                               "isTest": true])
// 设置后上传数据:
instance.track("product_view",
               properties: ["product_id" : "A1234"])
// 相当于在事件中设置了属性:

instance.track("product_view",
              properties: ["Channel" : "ABC",
                       "isTest": true,
                       "product_id" : "A1234"])

公共事件属性将会被保存到缓存中,无需每次启动App时调用。如果调用setSuperProperties:设置了先前已设置过的公共事件属性,则会覆盖之前的属性。如果公共事件属性和track:properties:上传的某个属性的Key重复,则该事件的属性会覆盖公共事件属性:

[instance setSuperProperties:@{@"Channel":@"ABC",
                              @"isTest":@YES}];
//覆盖"Channel",此时属性"Channel"的值为"XYZ"
[instance setSuperProperties:@{@"Channel":@"XYZ"}];

//覆盖"isTest","isTest"的值为False
[instance track:@"product_view"
     properties:@{@"isTest":@NO,
               @"product_id":@"A1234"}];
instance.setSuperProperties(["Channel" : "ABC",
                              "isTest": true])
//覆盖"Channel",此时属性"Channel"的值为"XYZ"
instance.setSuperProperties(["Channel" : "XYZ"])

//覆盖"isTest","isTest"的值为False
instance.track("product_view",
     properties: ["isTest": true,
               "product_id" : "A1234"])

如果您需要删除某个公共事件属性,您可以调用unsetSuperProperty:清除指定的公共事件属性;如果您想要清空所有公共事件属性,则可以调用clearSuperProperties:

//清除一条公共事件属性,将之前设置"isTest"属性清除
[instance unsetSuperProperty:@"isTest"];

//清除所有公共事件属性
[instance clearSuperProperties];
//清除一条公共事件属性,将之前设置"isTest"属性清除
instance.unsetSuperProperty("isTest")

//清除所有公共事件属性
instance.clearSuperProperties()

c) 设置动态公共属性

在1.2.0版本中,新增了动态公共属性的特性,即公共属性可以上报时获取当时的值,使得诸如等级、VIP等级之类的可变公共属性可以被便捷地上报。通过registerDynamicSuperProperties:设置动态公共属性类之后,SDK 将会在事件上报时自动执行并获取返回值中的属性,添加到触发的事件中。以下例子是每次上报时将获取当前时间并切换时区,当任意事件触发时,SDK会将返回的时间加入到该事件的属性中。

//设置动态公共属性,在事件上报时动态获取事件发生时刻
   [instance registerDynamicSuperProperties:^NSDictionary * _Nonnull{
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
        formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/Chicago"];
        NSDate *datenow = [NSDate date];
        NSString *currentTimeString = [formatter stringFromDate:datenow];
        return @{@"AmericaTime":currentTimeString};
    }];
//设置动态公共属性,在事件上报时动态获取事件发生时刻
    instance.registerDynamicSuperProperties { () -> [String : Any] in
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
        formatter.timeZone = TimeZone(abbreviation: "CDT")
        let currentTimeString = formatter.string(from: Date())
        print("currentTimeString", currentTimeString)
        return ["AmericaTime":currentTimeString]
    }

d) 记录事件时长

您可以调用timeEvent:来开始计时,配置您想要计时的事件名称,当您上传该事件时,将会自动在您的事件属性中加入#duration这一属性来表示记录的时长,单位为秒。

//开始计时,记录的事件为"product_view"
[instance timeEvent:@"product_view"];

//其他代码...

//上传事件,计时结束,"product_view"这一事件中将会带有表示事件时长的属性#duration
[instance track:@"product_view"
     properties:@{@"product_id":@"A1234"}];
//开始计时,记录的事件为"product_view"
instance.timeEvent("product_view")

//其他代码...

//上传事件,计时结束,"product_view"这一事件中将会带有表示事件时长的属性#duration
instance.track("product_view",
        properties: ["product_id":"A1234"])

4. 用户属性

TA平台目前支持的用户属性设置接口为user_set:user_setOnce:user_add:user_unset:user_delete

a) user_set

对于一般的用户属性,您可以调用user_set:来进行设置,使用该接口上传的属性将会覆盖原有的属性值,如果之前不存在该用户属性,则会新建该用户属性,类型与传入属性的类型一致

//设置用户属性
[instance user_set:@{@"UserName":@"TA",
                     @"Age":[NSNumber numberWithInt:20]}];
//设置用户属性
instance.user_set(["UserName": "TA",
             "Age": NSNumber.init(value: 20)])

  • user_set:来设置的用户属性是一个NSDictionary对象,其中每个元素代表一个属性。
  • Key的值为属性的名称,为NSString类型,规定只能以字母开头,包含数字,字母和下划线“_”,长度最大为50个字符,对字母大小写不敏感。
  • Value为该属性的值,可以为NSStringNSNumber以及NSDate,如果需要上传布尔型的属性,请以@YES@NO赋值

b) user_setOnce

如果您要上传的用户属性只要设置一次,则可以调用user_setOnce:来进行设置,当该属性之前已经有值的时候,将会忽略这条信息。

//设置用户名
[instance user_setOnce:@{@"UserName":@"TA"}];
//此时用户名为TA

[instance user_setOnce:@{@"UserName":@"ABC"}];
//此时用户名仍为TA,此条数据被忽略
//设置用户名
instance.user_setOnce(["UserName": "TA"])
//此时用户名为TA

instance.user_setOnce(["UserName": "ABC"])
//此时用户名仍为TA,此条数据被忽略

  • user_setOnce:设置的用户属性类型及限制条件与user_set:一致。

c) user_add

当您要上传数值型的属性时,您可以调用user_add:来对该属性进行累加操作,如果该属性还未被设置,则会赋值0后再进行计算

//设置累计付费金额
[instance user_add:@{@"TotalRevenue":[NSNumber numberWithInt:6]}];
//此时累计付费值为6

[instance user_add:@{@"TotalRevenue":[NSNumber numberWithInt:30]}];
//此时累计付费值为36
//设置累计付费金额
instance.user_add(["TotalRevenue": NSNumber.init(value: 6)])
//此时累计付费值为6

instance.user_add(["TotalRevenue": NSNumber.init(value: 30)])
//此时累计付费值为36

  • user_add:设置的属性类型以及Key值的限制与user_set:一致,但Value只允许NSNumber

d) user_unset

当您要清空用户的某个用户属性值时,您可以调用user_unset:来对指定属性进行清空操作,如果该属性还未在集群中被创建,则user_unset:不会创建该属性

//清空该用户的累计付费金额属性值
[instance user_unset:@"TotalRevenue"];
//清空该用户的累计付费金额属性值
instance.user_unset("TotalRevenue")

  • user_unset:的传入值为被清空属性的Key值。

e) user_delete

如果您要删除某个用户,可以调用user_delete将这名用户删除,您将无法再查询该名用户的用户属性,但该用户产生的事件仍然可以被查询到

[instance user_delete];
instance.user_delete()

5. 自动采集事件

关于自动采集事件的具体使用方法,请参考iOS SDK 自动采集指南一章。

6. SDK配置

a) 设置上传的网络条件

在默认情况下,SDK将会网络条件为在3G, 4G 及 Wifi时上传数据,您可以通过下列方法修改允许上传的网络条件:

//在2G, 3G, 4G 及 Wifi时上传数据
[[ThinkingAnalyticsSDK sharedInstance]setNetworkType:TDNetworkTypeALL];

//只在Wifi环境下上报数据
[[ThinkingAnalyticsSDK sharedInstance]setNetworkType:TDNetworkTypeOnlyWIFI];

//在3G, 4G 及 Wifi时上传数据, 默认设置
[[ThinkingAnalyticsSDK sharedInstance]setNetworkType:TDNetworkTypeDefault];
//在2G, 3G, 4G 及 Wifi时上传数据
ThinkingAnalyticsSDK.sharedInstance()?.setNetworkType(ThinkingAnalyticsNetworkType.TDNetworkTypeALL)

//只在Wifi环境下上报数据
ThinkingAnalyticsSDK.sharedInstance()?.setNetworkType(ThinkingAnalyticsNetworkType.TDNetworkTypeOnlyWIFI)

//在3G, 4G 及 Wifi时上传数据, 默认设置
ThinkingAnalyticsSDK.sharedInstance()?.setNetworkType(ThinkingAnalyticsNetworkType.TDNetworkTypeDefault)

b) 暂停/停止数据上报

在2.1.0版本中,新增了停止SDK上报数据的功能,一共有两类停止SDK上报的接口:

  1. 暂停SDK上报(enableTracking)

您可能希望在一些场景下,暂时停止SDK的数据采集以及上报,比如用户处于测试环境中、或者用户登录了一个测试账号,此时您可以调用下列接口,暂时停止SDK的上报。

您可以通过某一实例(包括主要实例以及轻实例)调用enableTracking:,传入false来暂停SDK的上报,该实例已经设置的#distinct_id#account_id、公共属性等将保留;该实例已经采集但还未上报成功的数据将继续尝试上报;后续该实例不能采集以及上报任何新数据、不能设置访客ID、账户ID以及公共属性等,但是可以读取该实例已经设置的公共属性和设备ID、访客ID、账号ID等信息。

实例的停止状态将会被保存在本地缓存,直到调用enableTracking:、传入true,SDK实例将会重新恢复数据采集以及上报,需要注意轻实例因为不进行缓存,因此每次打开APP后,轻实例的暂停状态不会被保留,将重新开启上报。

// 暂停上报
[instance enableTracking:NO];

// 恢复上报
[instance enableTracking:YES]; 
// 暂停上报
instance.enableTracking(false)

// 恢复上报
instance.enableTracking(true)

  1. 停止SDK上报(optOutTracking)

在一些特殊场景下,您可能需要完全停止SDK的功能,比如在适用GDPR的地区,用户选择不提供数据采集权限,则您可以调用如下接口完全关闭SDK的功能。

optOutTracking只能通过主要实例调用,与enableTracking的最大区别在于,其将会清空该实例的本地缓存,包括本实例的访客ID,账号ID,公共属性,以及未上报的数据队列。之后再关闭该实例的采集和上报功能。

// 停止上报,并重置本地缓存
[instance optOutTracking];
// 停止上报,并重置本地缓存
instance.optOutTracking()

如果您希望关闭SDK功能的同时,删除该用户在TA集群中的用户数据,可以调用optOutTrackingAndDeleteUser,这将会在停止SDK实例的功能前,上报一条 user_del数据,以删除该用户的用户数据。

// 停止上报,并发送删除用户请求
[instance optOutTrackingAndDeleteUser];
// 停止上报,并发送删除用户请求
instance.optOutTrackingAndDeleteUser()

实例的停止状态也将保存在本地缓存,直到调用optInTracking,后续可以继续上报,但此时相当于一个全新的实例

// 重新开启上报
[instance optInTracking];
// 重新开启上报
instance.optInTracking()

7. 相关预置属性

7.1 所有事件带有的预置属性

以下预置属性,是iOS SDK中所有事件(包括自动采集事件)都会带有的预置属性

属性名 中文名 说明
#ip IP地址 用户的IP地址,TGA将以此获取用户的地理位置信息
#country 国家 用户所在国家,根据IP地址生成
#country_code 国家代码 用户所在国家的国家代码(ISO 3166-1 alpha-2,即两位大写英文字母),根据IP地址生成
#province 省份 用户所在省份,根据IP地址生成
#city 城市 用户所在城市,根据IP地址生成
#os_version 操作系统版本 iOS 11.2.2、Android 8.0.0等
#manufacturer 设备制造商 用户设备的制造商,如Apple,vivo等
#os 操作系统 如Android、iOS等
#device_id 设备ID 用户的设备ID,iOS取用户的IDFV或UUID,Android取androidID
#screen_height 屏幕高度 用户设备的屏幕高度,如1920等
#screen_width 屏幕宽度 用户设备的屏幕高度,如1080等
#device_model 设备型号 用户设备的型号,如iPhone 8等
#app_version APP版本 您的APP的版本
#lib SDK类型 您接入SDK的类型,如Android,iOS等
#lib_version SDK版本 您接入SDK的版本
#network_type 网络状态 上传事件时的网络状态,如WIFI、3G、4G等
#carrier 网络运营商 用户设备的网络运营商,如中国移动,中国电信等
#zone_offset 时区偏移 数据时间相对UTC时间的偏移小时数

7.2 自动采集事件的预置属性

以下预置属性,是各个自动采集事件中所特有的预置属性

  • APP启动事件(ta_app_start)的预置属性
属性名 中文名 说明
#resume_from_background 是否从后台唤醒 表示APP是被开启还是从后台唤醒,取值为true表示从后台唤醒,false为直接开启
  • APP关闭事件(ta_app_end)的预置属性
属性名 中文名 说明
#duration 事件时长 表示该次APP访问(自启动至结束)的时长,单位是秒
  • APP浏览页面事件(ta_app_view)的预置属性
属性名 中文名 说明
#title 页面标题 为View Controller的标题,取值为controller.navigationItem.title属性的值
#screen_name 页面名称 为View Controller的类名
#url 页面地址 当前页面的地址,需要调用getScreenUrl进行url的设置
#referrer 前向地址 跳转前页面的地址,跳转前页面需要调用getScreenUrl进行url的设置
  • APP控件点击事件(ta_app_click)的预置属性
属性名 中文名 说明
#title 页面标题 为View Controller的标题,取值为controller.navigationItem.title属性的值
#screen_name 页面名称 为View Controller的类名
#element_id 元素ID 控件的ID,需要thinkingAnalyticsViewID进行设置
#element_type 元素类型 控件的类型
#element_selector 元素选择器 为控件的viewPath的拼接
#element_position 元素位置 控件的位置信息,只有当控件类型为UITableViewUICollectionView才会存在,表示控件被点击的位置,取值为组号(Section):行号(Row)
#element_content 元素内容 控件上的内容
  • APP崩溃事件(ta_app_crash)的预置属性
属性名 中文名 说明
#app_crashed_reason 异常信息 字符型,记录崩溃时的堆栈轨迹

7.3 其他预置属性

除了上述提到预置属性,还有部分预置属性需要调用对应接口才会被记录:

属性名 中文名 说明
#duration 事件时长 需要调用计时功能接口timeEvent:,记录事件发生时长,单位是秒

ChangeLog

v2.2.2

  • 修复使用 EnableSceneSupport 时,APP启动事件(ta_app_install)中的属性 #resume_from_background 取值`异常的问题

v2.2.0 2019/10/21

  • 新增user_unset接口,可用于清空一个用户属性
  • 新增预制属性#zone_offset,单位为小时。 默认情况下会将本地时区的偏移上报到服务端,该时间偏移会受夏令时影响。满足如下公式:
    utc_time + #zone_offset = #event_time
    

v2.1.1 2019/10/11

  • 优化上报逻辑,解决极端情况下数据异常上报的问题

v2.1.0 2019/09/16

  • 支持轻量级实例, 便于上报被动事件等需求
  • 新增 enableTracking 接口, 可以打开或关闭实例上报功能
  • 新增 optOutTracking/optInTracking 接口
  • 其他代码优化

v2.0.1 2019/07/15

  • 调整了自动采集事件中ta_app_install(APP安装事件)的触发顺序,现在将在ta_app_start(APP启动事件)前触发

v2.0.0 2019/07/12

  • 自动采集事件新增APP安装事件
  • 默认不采集后台自启时产生的数据,后续会添加后台自启接口,可控制是否采集后台自启时产生的数据

v1.2.0 2019/06/20

  • 新增多APPID实例功能
  • 新增动态公共属性特性
  • 自动采集事件新增APP崩溃事件

results matching ""

    No results matching ""